<?php

namespace App\Common\Robot\Contracts;

use App\Robot\Dto\ChatRecordMessageDTO;
use App\Robot\Dto\FileMessageDTO;
use App\Robot\Dto\GifMessageDTO;
use App\Robot\Dto\ImageMessageDTO;
use App\Robot\Dto\LocationMessageDTO;
use App\Robot\Dto\MiniProgramMessageDTO;
use App\Robot\Dto\SetProfileDTO;
use App\Robot\Dto\UrlMessageDTO;
use App\Robot\Dto\VideoChannelMessageDTO;
use App\Robot\Dto\VideoMessageDTO;
use App\Robot\Dto\VoiceMessageDTO;

interface GatewayInterface
{
    /**
     * 获取登录二维码
     * @param string $customerParam 自定义参数
     * @param string $proxyUrl 非必需，格式必须为: scheme://user:password@ip:port，如无验证直接写地址即可。目前只支持socks5. 如:socks5://root:123456@192.168.88.242:1080
     * @param int $onlyProxyLogin 1是仅登录代理2是全局代理
     * @return mixed
     */
    public function getLoginQrCode(string $customerParam,string $proxyUrl = '',int $onlyProxyLogin = 1): mixed;

    /**
     * 检测二维码
     * @return mixed
     */
    public function checkLoginQrCode(): mixed;

    /**
     * 检测登录状态
     * @return mixed
     */
    public function checkLogin(): mixed;

    /**
     * 登录验证
     * @param string $code
     * @return mixed
     */
    public function verifyLoginQrcode(string $code,string $loginQrcodeKey = ''): mixed;

    /**
     * 二次登录
     * @param string $userId
     * @param string $customerParam
     * @param string $proxyUrl
     * @param int $onlyProxyLogin
     * @param int $deviceType
     * @return mixed
     */
    public function manualLogin(string $userId, string $customerParam = '',string $proxyUrl = '',int $onlyProxyLogin = 1, int $deviceType = 1): mixed;

    /**
     * 取消代理
     * @return mixed
     */
    public function cancelProxy():mixed;

    /**
     * 退出登录
     * @return mixed
     */
    public function loginOut(): mixed;

    /**
     * 获取员工列表
     * @param string $currentVersion 联系人比较多时，需要分页查询。首次查询传空字符串，
     * 之后传上一次返回的值。使用此字段可以只获取变更的内部联系人。
     * @param int|null $limit
     * @return mixed
     */
    public function getEmployeeList(string $currentVersion = '', int $limit = null): mixed;

    /**
     * 获取员工详情
     * @param array $userIdList
     * @return mixed
     */
    public function getEmployeeDetail(array $userIdList): mixed;

    /**
     * 获取个人信息
     * @param string $userId
     * @return mixed
     */
    public function getProfile(string $userId = ''): mixed;

    /**
     * 设置个人信息
     * @param SetProfileDTO $data
     * @return mixed
     */
    public function setProfile(SetProfileDTO $data): mixed;

    /**
     * 获取个人二维码
     * @return mixed
     */
    public function getPersonalQRCode(): mixed;

    /**
     * 个人收藏-分页
     * @param int $seq
     * @param int|null $limit
     * @return mixed
     */
    public function syncCollectionMsg(int $seq = 0, int $limit = null): mixed;

    /**
     * 个人收藏-添加GIF表情
     * @param array $msgData
     * -- fileMd5图片md5
     * -- fileHttpUrl 图片原图CDN的url，接口详情见: 文件CDN转URL
     * @param int $type
     * 29，添加表情
     * @return mixed
     */
    public function insertCollectionMsg(array $msgData, int $type = 29): mixed;

    /**
     * 获取企业信息
     * @param array $corpIdList 默认为空时，查询当前账号企业
     * @return mixed
     */
    public function getCorpInfo(array $corpIdList = []): mixed;

    /**
     * 标签列表
     * @param int $labelType 1 企业标签 =2 个人标签
     * @param int $currentSeq
     * @return mixed
     */
    public function getTagList(int $labelType, int $currentSeq = 0): mixed;

    /**
     * 个人标签-增删改
     * @param int $opType
     * =1 新建标签， 此时必须设置 labelName 和 labelSuperId;
     * =2 删除标签，此时必须设置 labelId;
     * =3 修改标签， 此时必须设置 labelId 和 labelName,labelSuperId;
     * @param array $paramList
     * -- labelId 标签ID
     * -- labelSuperId 个人标签所属的分组ID
     * -- labelName 标签名称
     * -- labelDataType 1子标签 2组标签
     * @return mixed
     */
    public function editLabel(int $opType, array $paramList): mixed;

    /**
     * 客户标签-增删
     * @param int $opType 1:增加成员 2:删除成员
     * @param array $paramList
     * -- labelIdList
     * -- labelSuperIdList
     * -- labelOwnerList
     * -- userId 客户ID
     * @return mixed
     */
    public function contactEditLabel(int $opType, array $paramList): mixed;

    /**
     * 外部联系人分页
     * @param int $currentSeq
     * @param $limit
     * @param int|null $bizType
     * @return mixed
     */
    public function getContactList(int $currentSeq = 0, int $limit = null, int $bizType = null): mixed;

    /**
     * 联系人搜索
     * @param string $keyword
     * @return mixed
     */
    public function searchContact(string $keyword): mixed;

    /**
     * 添加个微
     * @param string $userId
     * @param string $unionId
     * @param string $verifyText
     * @return mixed
     */
    public function addSearchWxContact(string $userId, string $unionId, string $verifyText = ''): mixed;

    /**
     * 添加企业微信
     * @param string $userId
     * @param string $corpId
     * @param string $ticket
     * @param string $verifyText
     * @return mixed
     */
    public function addSearchWxWorkContact(string $userId, string $corpId, string $ticket, string $verifyText = ''): mixed;

    /**
     * 添加企微名片
     * @param string $presenterId
     * @param string $fromRoomId
     * @param string $userId
     * @param string $verifyText
     * @return mixed
     */
    public function addCardContact(string $presenterId, string $fromRoomId, string $userId, string $verifyText): mixed;

    /**
     * 添加删除联系人
     * 此情况适用于好友将自己删除了，需要自己重新发起验证添加该好友
     * @param string $userId
     * @param string $verifyText
     * @return mixed
     */
    public function addDeletedContact(string $userId, string $verifyText): mixed;

    /**
     * 同意添加联系人
     * @param string $userId
     * @param string $corpId
     * @return mixed
     */
    public function agreeContact(string $userId, string $corpId): mixed;

    /**
     * 联系人详情
     * @param array $useridList
     * @return mixed
     */
    public function getContactDetail(array $useridList): mixed;

    /**
     * 更新联系人
     * @param string $userid
     * @param string $remark
     * @param string $desc
     * @param string $corpRemark
     * @param array $mobileList
     * @param array $labelList
     * @return mixed
     */
    public function updateWxContact(string $userid, string $remark, string $desc, string $corpRemark, array $mobileList, array $labelList): mixed;

    /**
     * 内部联系人信息-更新
     * @param string $userid
     * @param string $remark
     * @param string $desc
     * @return mixed
     */
    public function updateWxWorkContact(string $userid, string $remark, string $desc): mixed;

    /**
     * 删除联系人
     * @param mixed $userId
     * @return mixed
     */
    public function deleteContact(mixed $userId): mixed;

    /**
     * OpenID
     * @param array $userIdList
     * @return mixed
     */
    public function useridToOpenuserid(array $userIdList): mixed;

    /**
     * 会话分页
     * @param int $currentSeq
     * @param int|null $limit
     * @return mixed
     */
    public function getSessionPage(int $currentSeq = 0, int $limit = null): mixed;

    /**
     * 会话组-编辑
     * @param string $chatId
     * @param int $chatType 1: 置顶 2: 取消置顶 3: 开启免打扰 4: 取消免打扰 5: 保存群聊到通讯录 6: 从通讯录移除群聊 7: 标记 8:取消标记
     * @return mixed
     */
    public function setSessionCmd(string $chatId, int $chatType): mixed;

    /**
     * 会话组-查询
     * @param int|null $getFlag
     * @return mixed
     */
    public function getSessionList(int $getFlag = null): mixed;

    /**
     * 创建群
     * @param array $memberList
     * @param int $isOuterRoom
     * @return mixed
     */
    public function createRoom(array $memberList, int $isOuterRoom = 1): mixed;

    /**
     * 修改群名称
     * @param mixed $roomId
     * @param string $roomName
     * @return mixed
     */
    public function editRoomName(mixed $roomId, string $roomName): mixed;

    /**
     * 生成群二维码
     * @param mixed $roomId
     * @return mixed
     */
    public function generateRoomQRCode(mixed $roomId): mixed;

    /**
     * 转让群主
     * @param mixed $roomId
     * @param mixed $newOwnerId
     * @return mixed
     */
    public function transferRoomOwner(mixed $roomId, mixed $newOwnerId): mixed;

    /**
     * 设置群管理员
     * @param mixed $roomId
     * @param array $memberList
     * @param bool $isSet true:设置群管理员 false:取消群管理员
     * @return mixed
     */
    public function setRoomAdmin(mixed $roomId, array $memberList, bool $isSet = true): mixed;

    /**
     * 退出群
     * @param mixed $roomId
     * @return mixed
     */
    public function outRoom(mixed $roomId): mixed;

    /**
     * 移除群成员
     * @param mixed $roomId
     * @param array $memberList
     * @param int $isOuterRoom
     * @return mixed
     */
    public function removeRoomMember(mixed $roomId, array $memberList, int $isOuterRoom = 1): mixed;

    /**
     * 群分页
     * @param int $nextStartIndex
     * @param int|null $limit
     * @return mixed
     */
    public function getRoomList(int $nextStartIndex = 0, int $limit = null): mixed;

    /**
     * 群详情
     * @param array $roomIdList
     * @return mixed
     */
    public function getRoomDetail(array $roomIdList): mixed;

    /**
     * 群公告
     * @param mixed $roomId
     * @param string $notice
     * @return mixed
     */
    public function postGrpAnn(mixed $roomId, string $notice): mixed;

    /**
     * 邀请/添加群成员
     * @param string $roomId
     * @param array $memberList
     * @param int $isOuterRoom
     * @return mixed
     */
    public function inviteFriendToRoom(string $roomId, array $memberList, int $isOuterRoom = 1): mixed;

    /**
     * 群成员邀请确认
     * @param string $roomId
     * @param string $inviterId
     * @param string $inviteMsgServerId
     * @param string $inviteCode
     * @param array $invitedMemberList
     * @return mixed
     */
    public function confirmInvitedMemberList(string $roomId,string $inviterId,string $inviteMsgServerId,string $inviteCode,array $invitedMemberList): mixed;

    /**
     * 解散群
     * @param mixed $roomId
     * @return mixed
     */
    public function dismissRoom(mixed $roomId): mixed;

    /**
     * 群ID转openID
     * @param string $roomId
     * @return mixed
     */
    public function roomidToOpenroomid(string $roomId): mixed;

    /**
     * 发送文本消息
     * @param string $content
     * @param string $toId
     * @return mixed
     */
    public function sendTextMsg(string $content, string $toId, array $reply = []): mixed;

    /**
     * 发送混合文本消息
     * @param array $content
     * - integer subtype  消息类型（=0表示普通文本 =1表示@人的userId, 当送0时为@所有人 =2表示系统表情 eg:[微笑][憨笑]）
     * - string text   文本内容
     * @param string $toId
     * @return mixed
     */
    public function sendMixTxtMsg(array $content, string $toId, array $reply = []): mixed;

    /**
     * 发送图片消息
     * @param ImageMessageDTO $imageMessage
     * @return mixed
     */
    public function sendImageMsg(ImageMessageDTO $imageMessage): mixed;

    /**
     * 发送GIF
     * @param GifMessageDTO $gifMessageDTO
     * @return mixed
     */
    public function sendGif(GifMessageDTO $gifMessageDTO): mixed;


    /**
     * 发送视频消息
     * @param VideoMessageDTO $videoMessage
     * @return mixed
     */
    public function sendVideoMsg(VideoMessageDTO $videoMessage): mixed;

    /**
     * 发送文件消息
     * @param FileMessageDTO $fileMessageDTO
     * @return mixed
     */
    public function sendFileMsg(FileMessageDTO $fileMessageDTO): mixed;

    /**
     * 发送语音消息
     * @param VoiceMessageDTO $voiceMessageDTO
     * @return mixed
     */
    public function sendVoiceMsg(VoiceMessageDTO $voiceMessageDTO): mixed;

    /**
     * 链接消息
     * @param UrlMessageDTO $urlMessageDTO
     * @return mixed
     */
    public function sendUrlMsg(UrlMessageDTO $urlMessageDTO): mixed;

    /**
     * 小程序消息
     * @param MiniProgramMessageDTO $miniProgramMessageDTO
     * @return mixed
     */
    public function sendMiniProgram(MiniProgramMessageDTO $miniProgramMessageDTO): mixed;

    /**
     * 名片消息
     * @param string $sharedId
     * @param string $toId
     * @return mixed
     */
    public function sendPersonalCard(string $sharedId, string $toId): mixed;

    /**
     * 位置消息
     * @param LocationMessageDTO $locationMessageDTO
     * @return mixed
     */
    public function sendLocation(LocationMessageDTO $locationMessageDTO): mixed;


    /**
     * @param VideoChannelMessageDTO $videoChannelMessageDTO
     * @return mixed
     */
    public function sendVideoChannelMsg(VideoChannelMessageDTO $videoChannelMessageDTO): mixed;

    /**
     * 发送聊天记录消息
     * @param ChatRecordMessageDTO $chatRecordMessageDTO
     * @return mixed
     */
    public function sendChatRecord(ChatRecordMessageDTO $chatRecordMessageDTO): mixed;

    /**
     * 撤回消息
     * @param string $chatId //客户id或者群id
     * @param int $msgServerId
     * @return mixed
     */
    public function revokeMsg(string $chatId,int $msgServerId): mixed;

    /**
     * 上传文件
     * @param string $url
     * @param string $filename
     * @param int $fileType 1: jpg图片, 4: mp4视频, 5: 文件(也包括语音amr文件)
     * @return mixed
     */
    public function upload(string $url, string $filename, int $fileType): mixed;

    /**
     * @param string $url
     * @param string $filename
     * @param int $fileType : 1jpg图片, 4: mp4视频, 5: 文件(也包括语音amr文件)
     * @return mixed
     */
    public function cdnBigUpload(string $url, string $filename, int $fileType): mixed;

    /**
     * 企微文件下载
     * @param string $fileAeskey
     * @param string $fileId
     * @param int $fileSize
     * @param int $fileType
     * 1: 大图. 如果【接收图片消息】中的字段 image_has_hd=1, 则可以使用这个type下载
     * 2: 小图. 如果image_has_hd=0, 则应该用这个type下载
     * 3: 视频/图片缩略图，对应thumb这个字段
     * 4: 视频
     * 5: 文件/语音文件
     * @return mixed
     */
    public function wxWorkDownload(string $fileAeskey, string $fileId, int $fileSize, int $fileType, string $filename = ''): mixed;

    /**
     * 个微文件下载
     * @param string $fileAeskey
     * @param string $fileAuthkey
     * @param int $fileSize
     * @param string $fileUrl
     * @param int $fileType
     * @return mixed
     */
    public function wxDownload(string $fileAeskey, string $fileAuthkey, int $fileSize, string $fileUrl, int $fileType, string $filename = ''): mixed;

    /**
     * 文件转url
     * @param string $fileAesKey
     * @param string $fileId
     * @param string $fileMd5
     * @return mixed
     */
    public function cdnToUrl(string $fileAesKey, string $fileId, string $fileMd5): mixed;

    /**
     * cdn数据刷新
     * @return mixed
     */
    public function cdnRefresher(): mixed;

    /**
     * 朋友圈列表
     * @param int $minSnsId
     * @param int|null $limit 最大支持1000条
     * @return mixed
     */
    public function getSnsRecord(int $minSnsId = 0, int $limit = null): mixed;

    /**
     * 朋友圈详情-批量
     * @param array $snsIdList
     * @return mixed
     */
    public function getSnsDetail(array $snsIdList): mixed;

    /**
     * 朋友圈上传文件
     * @param mixed $file
     * @param int $fileType 1：图片 2: 视频 3: 视频缩略图
     * @return mixed
     */
    public function snsUpload(mixed $file, int $fileType): mixed;

    /**
     * 发朋友圈
     * @param int $postType 0图片/视频，1链接/视频号
     * @param string $content
     * @param array $mediaList
     * @param array $linkInfo
     * @param array $visibleUserIdList 指定好友可见。可不传，此时全部好友可见
     * @return mixed
     */
    public function postSns(int $postType, string $content, array $mediaList, array $linkInfo, array $visibleUserIdList = []): mixed;

    /**
     * 朋友圈点赞
     * @param int $snsId
     * @param int $snsStatus 0点赞，1取消点赞
     * @return mixed
     */
    public function snsLike(int $snsId, int $snsStatus = 0): mixed;

    /**
     * 评论/追评
     * @param int $snsId
     * @param string $content
     * @param int $refCommentId 某评论的commentId
     * @return mixed
     */
    public function snsComment(int $snsId, string $content, int $refCommentId = 0): mixed;

    /**
     * 删除朋友圈评论
     * @param int $snsId
     * @param int $commentId
     * @return mixed
     */
    public function deleteSnsComment(int $snsId, int $commentId): mixed;

    /**
     * 删除朋友圈
     * @param int $snsId
     * @return mixed
     */
    public function deleteSns(int $snsId): mixed;

    /**
     * @param int $businessId 1、外部联系人信息（+变动的）数据 2、好友申请的数据
     * @param int $msgSeq
     * @param int|null $limit
     * @return mixed
     */
    public function dataSync(int $businessId, int $msgSeq = 0, int $limit = null): mixed;


    /**
     * @param array $msgList
     * @param int $sendType  0: 表示外部联系人 1: 表示外部群
     * @param array $toIdList
     * @return mixed
     */
    public function sendGroupMsg(array $msgList,int $sendType,array $toIdList): mixed;

    /**
     * @param array $userIdList
     * @param int $sendType  0: 表示外部联系人 1: 表示外部群
     * @return mixed
     */
    public function queryGroupMsgEnabledMembers(array $userIdList,int $sendType): mixed;
}